From: Jacek Konieczny Date: Fri, 23 May 2014 12:47:21 +0000 (+0200) Subject: libxenstat: handle renamed VIFs X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4933 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=b2a332bfde7aff580f461a1d81b5340573d556d1;p=xen.git libxenstat: handle renamed VIFs Before trying to parse network interface name as 'vif*.*' try to get the domid and network number from sysfs. Fixes xentop output for domains with VIF renamed through the 'vifname' xl option. Signed-off-by: Jacek Konieczny Acked-by: Ian Campbell --- diff --git a/tools/xenstat/libxenstat/src/xenstat_linux.c b/tools/xenstat/libxenstat/src/xenstat_linux.c index 24335e1336..7fdf70a15f 100644 --- a/tools/xenstat/libxenstat/src/xenstat_linux.c +++ b/tools/xenstat/libxenstat/src/xenstat_linux.c @@ -233,6 +233,29 @@ int parseNetDevLine(char *line, char *iface, unsigned long long *rxBytes, unsign return 0; } +/* Find out the domid and network number given an interface name. + * Return 0 if the iface cannot be recognized as a Xen VIF. */ +static int get_iface_domid_network(const char *iface, unsigned int *domid_p, unsigned int *netid_p) +{ + char nodename_path[48]; + FILE * nodename_file; + int ret; + + snprintf(nodename_path, 48, "/sys/class/net/%s/device/nodename", iface); + nodename_file = fopen(nodename_path, "r"); + if (nodename_file != NULL) { + ret = fscanf(nodename_file, "backend/vif/%u/%u", domid_p, netid_p); + fclose(nodename_file); + if (ret == 2) + return 1; + } + + if (sscanf(iface, "vif%u.%u", domid_p, netid_p) == 2) + return 1; + + return 0; +} + /* Collect information about networks */ int xenstat_collect_networks(xenstat_node * node) { @@ -309,8 +332,7 @@ int xenstat_collect_networks(xenstat_node * node) } } else /* Otherwise we need to preserve old behaviour */ - if (strstr(iface, "vif") != NULL) { - sscanf(iface, "vif%u.%u", &domid, &net.id); + if (get_iface_domid_network(iface, &domid, &net.id)) { net.tbytes = txBytes; net.tpackets = txPackets;